Skip to main content

Variables et Mariadb Challenge

Challenge :

  1. Installer manuellement un nouveau container avec LXC nommé « mysql ».
  2. Ajouter le dans le fichier d’inventaire de votre dépôt Ansible.
  3. Déployer une recette qui installe un serveur MySQL.
  4. Créer un fichier mysql dans etc/host_vars/ qui contient une variable avec un mot de passe, par exemple mysql_password.
  5. Déployer un compte utilisateur bob avec des droits sur toutes les bases de données en utilisant le module mysql_user.
  6. Déployer une base de données eponges en utilisant le module Ansible approprié.
  7. Modifier l’utilisateur bob pour qu’il ne puisse accéder qu’à la base de données eponges.

Solution :

  1. Nous avons créé un nouveau container nommé mysql avec LXC, puis nous avons assuré l'accès via SSH et avons modifié le fichier etc/hosts.

    vim etc/hosts_vars/mysql
    mysql_password: "12345"
  2. Création du fichier ansible/playbooks/mysql.yml :

    ---
    - name: deploy mysql
    hosts: mysql
    remote_user: root
    roles:
    - mysql
  3. Modification du fichier ansible/playbooks/roles/mysql/tasks/main.yml :

    - name: Install Mysql
    ansible.builtin.apt:
    state: present
    update_cache: yes
    pkg:
    - mysql-server
    - python3-pymysql
    - percona-toolkit

    - name: Create a new database with name 'eponges'
    community.mysql.mysql_db:
    name: eponges
    state: present
    login_unix_socket: /run/mysqld/mysqld.sock

    - name: Create user 'bob' with all database privileges
    mysql_user:
    name: bob
    password: "{{ mysql_password }}"
    priv: '*.*:ALL,GRANT'
    state: present
    login_unix_socket: /run/mysqld/mysqld.sock
  4. Fichier .github/workflows/tp.yml :

    name: Deploy Ansible Project

    on:
    push:
    branches:
    - master
    workflow_dispatch:

    jobs:
    build:
    runs-on: self-hosted
    steps:
    - name: Checkout Repository
    uses: actions/checkout@v2

    - name: copy ansible files to right place
    run: |
    mkdir -p /home/student/ansible
    rsync -av --delete -P ansible/* /home/student/ansible

    - name: Deploy Ansible Project
    working-directory: /home/student/challenge-s08-e01-bis-sameddemet/ansible
    run: |
    ansible-playbook playbooks/mysql.yml
  5. Après les modifications, le git push a créé une base de données nommée eponges et un utilisateur nommé bob avec des droits sur toutes les bases de données.

  6. Modification de l'utilisateur bob pour qu'il n'ait accès qu'à la base de données eponges: Modifier la ligne priv: dans le fichier ansible/playbooks/roles/mysql/tasks/main.yml comme suit :

    priv: 'eponges.*:ALL,GRANT'
  7. Utilisation de boucles avec Ansible Loops pour créer plusieurs utilisateurs :

    - name: Modify user bob so that he can only access the eponges database
    mysql_user:
    name: "{{ item }}"
    password: "{{ mysql_password }}"
    priv: 'eponges.*:ALL,GRANT'
    state: present
    login_unix_socket: /run/mysqld/mysqld.sock
    loop:
    - bob
    - toto
    - tata
    - titi

    Dans …tasks/main.yml, la partie loop devrait ressembler à ceci :

    - name: Modify user bob so that he can only access the eponges database
    mysql_user:
    name: "{{ item.name }}"
    password: "{{ item.password }}"
    priv: 'eponges.*:ALL,GRANT'
    state: "{{ item.state }}"
    login_unix_socket: /run/mysqld/mysqld.sock
    loop: "{{ user_list }}"

Modification des utilisateurs avec des mots de passe différents et suppression de certains utilisateurs :

Afin d'assurer que chaque utilisateur a un mot de passe différent et de gérer la suppression de certains utilisateurs, nous avons effectué les étapes suivantes :

Fichier ansible/host_vars/mysql :

user_list:
- name: bob
password: "HBvp64I5OQaFHyjhjESRBwuly"
state: present
- name: toto
password: "QOHAAlSMpdjbFCGGikX5MfuQ9"
state: present
- name: tata
password: "xnETh7KY4yuBdPY4qqUaGSntZ"
state: present
- name: titi
password: "jj41FtubOgbR8FwBRPaFM1nYA"
state: absent

Fichier ansible/playbooks/roles/mysql/tasks/main.yml :

- name: Création des utilisateurs avec accès à la base de données eponges
mysql_user:
name: "{{ item.name }}"
password: "{{ item.password }}"
priv: 'eponges.*:ALL,GRANT'
state: "{{ item.state }}"
login_unix_socket: /run/mysqld/mysqld.sock
loop: "{{ user_list }}"

Ainsi, le challenge Ansible Mariadb a été résolu avec succès en suivant ces étapes. Vous pouvez personnaliser selon vos besoins.